﻿using AppForm_Managers.Object_Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppForm_Managers.Views
{
    public partial class Location_Provinces : Form
    {
        public Location_Provinces()
        {
            InitializeComponent();
        }

        private void Location_Provinces_Load(object sender, EventArgs e)
        {
            NotiLable.Text = "";
            NotiLable.Visible = false;
            ErrorProvider.Dispose();


            GridProvinces_DataLoad();
        }

        private void GridProvinces_DataLoad()
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            GridProvinces.DataSource = db.Provinces.ToList();
            db.Dispose();
        }


        private void AddProvinceButton_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            string prov = ProvinceText.Text.Trim();
            if (prov.Length == 0)
            {
                ErrorProvider.SetError(ProvinceText, "Tên tỉnh, thành không được để trống");
                ProvinceText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                foreach (var item in db.Provinces)
                {
                    if (item.NameOfProvince.ToLower().Equals(prov.ToLower()))
                    {
                        NotiLable.Visible = true;
                        NotiLable.ForeColor = Color.FromArgb(0xF9, 0x74, 0x42);
                        NotiLable.Text = "Tỉnh thành này đã tồn tại, hãy nhập lại";
                        ProvinceText.Focus();
                        return;
                    }
                }
                Province provine = new Province()
                {
                    NameOfProvince = prov,
                    StatusOfProvince = CheckProvinceStatus.Checked
                };
                db.Provinces.Add(provine);
                db.SaveChanges();

                NotiLable.Visible = true;
                NotiLable.ForeColor = Color.Teal;
                NotiLable.Text = "Thêm mới tỉnh thành thành công.";

                ProvinceText.Text = "";
                CheckProvinceStatus.Checked = false;

                GridProvinces_DataLoad();
                db.Dispose();
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                ProvinceText.Focus();
                return;
            }
            finally
            {
                db.Dispose();
            }
        }


        private void ProvincesControls_Reset()
        {
            ProvinceText.Text = "";
            CheckProvinceStatus.Checked = false;

            ErrorProvider.Dispose();
            AddProvinceButton.Enabled = true;
            ProvinceUpdateButton.Enabled = false;
            ProvinceDeleteButton.Enabled = false;
        }



        private void ViewProvinces_Click(object sender, EventArgs e)
        {
            NotiLable.Text = "";
            NotiLable.Visible = false;
            ErrorProvider.Dispose();

            List<int> listSelected = ViewProvinces.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }

            if (index > -1)
            {
                ProvinceUpdateButton.Enabled = true;
                ProvinceDeleteButton.Enabled = true;
                AddProvinceButton.Enabled = false;

                ProvinceText.Text = ViewProvinces.GetRowCellValue(index, "NameOfProvince").ToString();
                CheckProvinceStatus.Checked = bool.Parse(ViewProvinces.GetRowCellValue(index, "StatusOfProvince").ToString());
            }
        }

        private void ProvinceUpdateButton_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            string prov = ProvinceText.Text.Trim();
            if (prov.Length == 0)
            {
                ErrorProvider.SetError(ProvinceText, "Tên tỉnh thành không được để trống");
                ProvinceText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();


            List<int> k = ViewProvinces.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in k)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();

            int id = Int32.Parse(ViewProvinces.GetRowCellValue(index, "ProvID").ToString());
            try
            {
                foreach (var item in db.Provinces)
                {
                    if (item.NameOfProvince.ToLower().Equals(prov.ToLower()) && item.ProvID != id)
                    {
                        NotiLable.Visible = true;
                        NotiLable.ForeColor = Color.OrangeRed;
                        NotiLable.Text = "Tỉnh thành đã tồn tại, không thể chỉnh sửa được.";
                        ProvinceText.Focus();
                        return;
                    }
                }

                Province pro = db.Provinces.Single(p => p.ProvID == id);
                pro.NameOfProvince = prov;
                pro.StatusOfProvince = CheckProvinceStatus.Checked;

                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    NotiLable.Text = "Cập nhật thành công.";

                    ProvinceText.Text = "";
                    CheckProvinceStatus.Checked = false;

                    GridProvinces_DataLoad();
                    ProvincesControls_Reset();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                ProvinceText.Focus();
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ProvinceDeleteButton_Click(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<int> k = ViewProvinces.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in k)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }

                int id = Int32.Parse(ViewProvinces.GetRowCellValue(index, "ProvID").ToString());
                Province proCurrent = db.Provinces.Single(p => p.ProvID == id);
                List<District> distList = proCurrent.Districts.ToList<District>();

                foreach (var districtItem in distList)
                {
                    List<Commune> commList = districtItem.Communes.ToList<Commune>();
                    foreach (var communeItem in commList)
                    {
                        List<Organization> listOrgan = communeItem.Organizations.ToList<Organization>();
                        foreach (var organItem in listOrgan)
                        {
                            List<Department> listOfDepartment = organItem.Departments.ToList<Department>();
                            foreach (var departItem in listOfDepartment)
                            {
                                List<Employee> listEmpmanager = departItem.Employees1.ToList<Employee>();
                                foreach (var empManagerItem in listEmpmanager)
                                {
                                    List<Profile> listOfProfile = empManagerItem.Profiles.ToList<Profile>();
                                    foreach (var proItem in listOfProfile)
                                    {
                                        db.Profiles.Remove(proItem);
                                    }

                                    List<FamilyRelationship> listOfFamily = empManagerItem.FamilyRelationships.ToList<FamilyRelationship>();
                                    foreach (var family in listOfFamily)
                                    {
                                        db.FamilyRelationships.Remove(family);
                                    }

                                    List<TrainingFostering> listOfTrain = empManagerItem.TrainingFosterings.ToList<TrainingFostering>();
                                    foreach (var trainItem in listOfTrain)
                                    {
                                        db.TrainingFosterings.Remove(trainItem);
                                    }

                                    List<EmployeesSalaryLevel> listOfSal = empManagerItem.EmployeesSalaryLevels.ToList<EmployeesSalaryLevel>();
                                    foreach (var salItem in listOfSal)
                                    {
                                        db.EmployeesSalaryLevels.Remove(salItem);
                                    }

                                    List<EmployeesQualification> listOfQua = empManagerItem.EmployeesQualifications.ToList<EmployeesQualification>();
                                    foreach (var quaItem in listOfQua)
                                    {
                                        db.EmployeesQualifications.Remove(quaItem);
                                    }

                                    List<EmployeesPostion> listOfPost = empManagerItem.EmployeesPostions.ToList<EmployeesPostion>();
                                    foreach (var postItem in listOfPost)
                                    {
                                        db.EmployeesPostions.Remove(postItem);
                                    }

                                    db.Employees.Remove(empManagerItem);
                                }
                                db.Departments.Remove(departItem);
                            }
                            db.Organizations.Remove(organItem);
                        }
                        db.Communes.Remove(communeItem);
                    }
                    // Delete Districts
                    db.Districts.Remove(districtItem);
                }
                db.Provinces.Remove(proCurrent);


                if (MessageBox.Show(String.Format("Bạn có muốn xóa tỉnh thành '{0}' không? tất cã dữ liệu trong tỉnh sẻ bị mất hết", proCurrent.NameOfProvince), "Xóa dữ liệu", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    NotiLable.Text = "Xóa tỉnh, thành thành công";
                    ProvinceText.Focus();

                    ProvincesControls_Reset();
                    GridProvinces_DataLoad();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử lại sau", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn muốn hủy bỏ thao tác và làm mới", "Hủy bỏ thao tác", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == System.Windows.Forms.DialogResult.Yes)
            {
                NotiLable.Text = "";
                NotiLable.Visible = false;
                ErrorProvider.Dispose();
                ProvincesControls_Reset();
            }
        }
    }
}